package com.specter.dev.code.builder;

import java.util.ArrayList;
import java.util.List;

import com.specter.dev.code.builder.GenConfiguration.Module;
import com.specter.dev.code.builder.GenConfiguration.ModuleInput;
import com.specter.dev.code.builder.GenConfiguration.ModuleOutput;
import com.specter.dev.code.execute.ModuleInputExe;
import com.specter.dev.code.execute.ModuleInputExeFactory;
import com.specter.dev.code.execute.ModuleOutputExe;
import com.specter.dev.code.execute.ModuleOutputExeDefault;
import com.specter.utils.StringUtils;

/**
 * Note:手动执行时的main入口
 * 
 * @author Liang.Wang
 * @version Mar 23, 2017
 */
public class GenConfigurationBuilder {

	private GenConfiguration config;
	private ModuleInputExe iexe;
	private ModuleOutputExe oexe;

	private GenConfigurationBuilder() {
		this.iexe = null;// 后面动态生成
		this.oexe = new ModuleOutputExeDefault();
	}

	public static GenConfigurationBuilder cfg(String config) {
		GenConfigurationBuilder builder = new GenConfigurationBuilder();
		builder.config = new GenConfiguration(config);
		return builder;
	}

	/**
	 * 根据配置生成相应的文件（<b style="color:red;">这里是一次性加载所有的LINK源，推荐一次只配置一个源</b>）
	 */
	public void build() {
		// 初始化配置文件并生成本对象
		for (Module module : config.modules) {
			this.build(module);// 默认输出处理类
		}
	}

	public void build(Module module) {

		// 1.执行input获取实体列表
		List<Object> list = new ArrayList<>();
		for (ModuleInput input : module.getInputs()) {
			iexe = ModuleInputExeFactory.create(input.getType());
			list.addAll(iexe.input(input));
		}

		// 2.封装公共数据
		ModuleOutputExe.DataModel data = new ModuleOutputExe.DataModel();
		data.setMeta(module.getMetas());
		data.setInputs(list);
		data.func("_su", new StringUtils());

		// 3.执行output生成相应文件
		for (ModuleOutput output : module.getOutputs()) {
			oexe.output(output, data);
		}
		System.out.println("====== 所有文件生成成功 ！======");
	}

}
